/**
 * 定义store模块,用于处理购物车数据
 * 购物车数组中保存的每件选购商品对象信息：{id, price, image, title, amount, checked}
 */
const cartModule = {
    // 开启命名空间，防止全局污染
    namespaced: true,
    // 状态数据
    state: {
        cart: [], // 保存所有购物车中的商品数据
    },
    // 计算值
    getters: {
        // 购物车数组
        cart(state){
            return state.cart
        },
        // 计算总价格
        totalPrice(state){
            return state.cart.reduce((sum, curr) => curr.checked ? (sum + curr.price * curr.amount) : sum, 0) * 100
        },
        // 购物车中商品总数量
        totalAmount(state){
            const count =  state.cart.reduce((sum, curr) => sum + curr.amount, 0)
            return count > 99 ? '99+' : count
        },
        // 是否全选
        isAllChecked(state){
            return state.cart.every(goods => goods.checked)
        },
    },
    // 同步跟新状态数据的方法
    mutations: {
        // 选购商品加入购物车处理
        /**
         * 需要判断购物车中已有当前选购商品的信息，有则直接叠加数量
         * 如果购物车中不存在当前选购商品才将商品对象添加到购物车数组中进行保存
         * @param {*} state 
         * @param {*} payload 当前选购商品对象
         */
        addCart(state, payload){
            // 查找当前购物车中是否有当前已选商品
            const goods = state.cart.find(prod => prod.id === payload.id)
            if(goods){
                goods.amount += payload.amount ?? 1
            }else { // 没有商品则添加到数组中保存
                state.cart.push({
                    ...payload,
                    amount: payload.amount ?? 1, //选购商品数量默认为 1
                    checked: true, // 是否在购物车中已选择，方便结算
                })
            }
        },
        // 删除购物车商品
        removeCart(state, id){
            state.cart = state.cart.filter(goods => goods.id !== id)
        },
        // 规格购物车中选购物品的数量
        modifyAmount(state, payload){
            state.cart = state.cart.map(goods => {
                // 如果找到对应的商品，则修改数量
                if(goods.id === payload.id){
                    goods.amount = payload.amount
                }
                return goods
            })
        },
        // 修改商品选中状态
        toggle(state, id){
            state.cart = state.cart.map(goods => {
                if(goods.id === id){
                    goods.checked = !goods.checked
                }
                return goods
            })
        },
        // 全选或取消全选
        checkAll(state, checked){
            state.cart = state.cart.map(goods => {
                goods.checked = checked
                return goods
            })
        }
    },
    // 异步方法，不能直接跟新状态数据，需要提交mutation
    actions: {}
}

export default cartModule